package com.yeban.javase.day18.test.test1;

import com.yeban.javase.day17.test.test4.MyRunnable;

import java.util.concurrent.*;

/**
 * @Desc TODO
 * @Author yeban
 * @Date 2025/11/2
 *
 * 需求：
 * 线程1要执行打印：A和C，线程2要执行打印：B，
 * 但线程1在打印A后，要线程2打印B之后才能打印C，
 * 所以：线程1在打印A后，必须等待线程2打印完B之后才能继续执行。
 *
 * 多线程的情况下 C -> B -> A
 * 阻塞队列LinkedBlockingQueue
 *
 */
public class LinkedBlockingQueueCBA {

    public static void main(String[] args) {

        // 1.创建自定义线程池子
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                0, 3,
                60L, TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );

        // 2.按照 C -> B -> A顺序，执行对应任务的线程
        pool.execute(new MyRunnableCBA("任务C"));
        pool.execute(new MyRunnableCBA("任务B"));
        pool.execute(new MyRunnableCBA("任务A"));

        // 3.关闭线程池
        pool.shutdown();
    }
}

class MyRunnableCBA implements Runnable {
    // 任务名称
    private String name;

    public MyRunnableCBA() {
    }

    public MyRunnableCBA(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "，执行的任务是：" + name);
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    public String toString() {
        return "RunnableCBA{name = " + name + "}";
    }
}
